#include "adc_driver.h"
#include "device.h"

#define ADC_PIR_CHANNEL ADC_EXINPUT_PB05
#define ADC_TIME_CHANNEL ADC_EXINPUT_PD06
#define ADC_LIGHT_CFG_CHANNEL ADC_EXINPUT_PA01
#define ADC_SENSITIVITY_CHANNEL ADC_EXINPUT_PB04
#define ADC_PHOTOD_CHANNEL ADC_EXINPUT_PC06

static void adc_port_init(void);
static void adc_mode_init(void);

void adc_driver_init(void)
{
    adc_port_init(); ///< ADC采样端口初始化
    adc_mode_init();
    //    printf("the adc top digital:%f,top voltage:%f \r\n",ADC_TOP_DIGITAL,ADC_TOP_VOLTAGE);
}

///< ADC 采样端口初始化--设置为模拟端口
static void adc_port_init(void)
{

    GPIO_PB05_ANALOG_SET(); // PIR -- PB05
    GPIO_PD06_ANALOG_SET(); // Time -- PD06    S2   时间设置档
    GPIO_PA01_ANALOG_SET(); // Light -- PA01   S3  光照度设置档
    GPIO_PB04_ANALOG_SET(); // Sensitivity -- PB04   S1 PIR感应灵敏度
    GPIO_PC06_ANALOG_SET(); // photoD -- PC06   光线亮度
}

static void adc_mode_init(void)
{
    stc_adc_cfg_t stcAdcCfg = {0};

    SYSCTRL_PeriphClkEnable(SYSCTRL_PERIRESET_ADC);

    stcAdcCfg.u32ClkDiv = ADC_CLOCK_PCLK_DIV128;          ///< 采样分频-128
    stcAdcCfg.u32SampCycleSel = ADC_SAMPLINGTIME_12CYCLE; ///< 采样周期数-12
    stcAdcCfg.u32RefVolSel = ADC_REF_VOLTAGE_AVCC;        ///< 参考电压选择-AVCC

    ADC_Init(ADC, &stcAdcCfg);
}

uint16_t adc_read_channel(ADC_TypeDef *ADCx, uint32_t channel)
{
    ADC_ClearFlag_EOC(ADCx);           // 清除转换完成标志
    ADC_SetInputSource(ADCx, channel); // 配置指定通道
    ADC_StartSingleConversion(ADCx);   // 启动单次转换

    while (!ADC_IsActiveFlag_EOC(ADCx))
        ;                       // 等待转换完成（轮询模式）
    ADC_ClearFlag_EOC(ADCx);    // 清除标志位
    return ADC_GetResult(ADCx); // 返回转换结果
}

uint16_t get_pir_val(void)
{
    return adc_read_channel(ADC, ADC_PIR_CHANNEL);
}

uint16_t get_time_val(void)
{
    return adc_read_channel(ADC, ADC_TIME_CHANNEL);
}

uint16_t get_brightness_val(void)
{
    return adc_read_channel(ADC, ADC_LIGHT_CFG_CHANNEL);
}

uint16_t get_pir_sensor_sensitivity_val(void)
{
    return adc_read_channel(ADC, ADC_SENSITIVITY_CHANNEL);
}

uint16_t get_photoD_val(void)
{
    return adc_read_channel(ADC, ADC_PHOTOD_CHANNEL);
}
